home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / View.C < prev    next >
C/C++ Source or Header  |  1992-07-16  |  7KB  |  354 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "View.h"
  6.  
  7. #include "Class.h"
  8. #include "Error.h"
  9. #include "Document.h"
  10. #include "Menu.h"
  11. #include "CmdNo.h"
  12. #include "ClipBoard.h"
  13. #include "PrintManager.h"
  14. #include "Alert_e.h"
  15. #include "Clipper.h"
  16. #include "OrdColl.h"
  17. #include "String.h"
  18. #include "Data.h"
  19. #include "FileDialog.h"
  20. #include "Progress.h"
  21.  
  22. //---- View --------------------------------------------------------------------
  23.  
  24. NewAbstractMetaImpl(View, VObject, (TP(clippers), TP(nexthandler), TP(focus)));
  25.  
  26. View::View(EvtHandler *eh, Rectangle itsExtent, int id) : VObject(itsExtent, id)
  27. {
  28.     clippers= 0;
  29.     ResetFlag(eVObjOpen|eVObjHFixed|eVObjVFixed);
  30.     nexthandler= eh;
  31. }
  32.  
  33. View::~View()
  34. {
  35.     if (clippers) {
  36.     SeqCollection *tmp= clippers;
  37.     clippers= 0;
  38.     tmp->ForEach(VObject,Remove)(this);
  39.     delete tmp;
  40.     }
  41. }
  42.  
  43. void View::DoObserve(int i, int c, void *v, Object *op)
  44. {
  45.     if (op == (PrintManager*) gPrintManager) {
  46.     if (Width() != gPrintManager->GetViewRect().Width())
  47.         SetWidth(gPrintManager->GetViewRect().Width());
  48.     } else
  49.     VObject::DoObserve(i, c, v, op);
  50. }
  51.  
  52. Document *View::GetDocument()
  53. {
  54.     return (Document*) FindNextHandlerOfClass(Meta(Document));
  55. }
  56.  
  57. void View::SetExtent(Point newExtent)
  58. {
  59.     if (GetExtent() != newExtent) {
  60.     VObject::SetExtent(newExtent);
  61.     if (clippers) {
  62.         clippers->ForEach(EvtHandler,Control)(GetId(),cPartExtentChanged,this);
  63.     }
  64.     }
  65. }
  66.  
  67. void View::ExtentChanged(VObject*)
  68. {
  69.     if (clippers) {
  70.     clippers->ForEach(VObject,ExtentChanged)(this);
  71.     }
  72. }
  73.  
  74. void View::SetContainer(VObject *v)
  75. {
  76.     VObject::SetContainer(v);
  77.     
  78.     if (clippers == 0)
  79.     clippers= new OrdCollection;
  80.     if (!clippers->FindPtr(v))
  81.     clippers->Add(v);
  82. }
  83.  
  84. void View::ClearContainer(VObject *clipper)
  85. {
  86.     VObject::ClearContainer(clipper);
  87.     if (clippers) {
  88.     clippers->RemovePtr(clipper);
  89.     if (clippers->Size() <= 0)
  90.         SafeDelete(clippers);
  91.     }
  92. }
  93.  
  94. void View::CheckOpen()
  95. {
  96.     ResetFlag(eVObjOpen);
  97.     if (clippers) {
  98.     Iter next(clippers);
  99.     VObject *fp;
  100.     
  101.     while (fp= (VObject*) next()) {
  102.         if (fp->IsOpen()) {
  103.         SetFlag(eVObjOpen);
  104.         break;
  105.         }
  106.     }
  107.     }
  108.     if (IsOpen())
  109.     Update();  // hack
  110. }
  111.  
  112. void View::Open(bool)
  113. {
  114.     //if (mode)
  115.     //    VObject::Open(mode);
  116.     //else
  117.     CheckOpen();
  118. }
  119.  
  120. //---- drawing
  121.  
  122. void View::DrawAll(Rectangle r, bool)
  123. {
  124.     if (!gPrinting)
  125.     Update();
  126.     Draw(r);
  127.     if (!TestFlag(eViewNoPrint))
  128.     gPrintManager->ShowPageGrid(r, this);
  129. }
  130.  
  131. void View::InvalidateRect(Rectangle r)
  132. {
  133.     if (clippers) {
  134.     clippers->ForEach(VObject,InvalidateViewRect)(r);
  135.     }
  136. }
  137.  
  138. void View::ShowInAllClippers(VoidObjMemberFunc of, Object *op, void *v1, void *v2, void *v3, void *v4)
  139. {
  140.     if (clippers) { 
  141.     clippers->ForEach(Clipper,DrawInFocus)(of, op, v1, v2, v3, v4);
  142.     }
  143. }
  144.  
  145. void View::Update()
  146. {
  147. }
  148.  
  149. Rectangle View::GetViewedRect()
  150. {
  151.     if (focus)
  152.     return focus->GetViewedRect();
  153.     return gRect0;
  154. }
  155.  
  156. //---- Printing
  157.  
  158. Rectangle View::NextPageBreak(int, Rectangle r)
  159. {
  160.     return r;
  161. }
  162.  
  163. void View::PrintAdorn(Rectangle, int)
  164. {
  165.     // GrPaintRect(r, ePatGrey12);
  166. }
  167.  
  168. //---- Selection
  169.  
  170. void View::ShowSelection(bool, bool)
  171. {
  172. }
  173.  
  174. void View::ClearSelection(bool)
  175. {
  176. }
  177.  
  178. //---- scrolling
  179.  
  180. void View::ConstrainScroll(Point*)
  181. {
  182. }
  183.  
  184. void View::RevealRect(Rectangle revealRect, Point minToSee)
  185. {
  186.     //if (focus)
  187.     //    focus->RevealRect(revealRect, minToSee);
  188.     //else
  189.     if (clippers) {
  190.     clippers->ForEach(VObject,RevealRect)(revealRect, minToSee);
  191.     }
  192. }
  193.  
  194. void View::RevealAlign(Rectangle revealRect, VObjAlign al)
  195. {
  196.     //if (focus)
  197.     //    focus->RevealAlign(revealRect, al);
  198.     //else
  199.     if (clippers) {
  200.     clippers->ForEach(VObject,RevealAlign)(revealRect, al);
  201.     }
  202. }
  203.  
  204. void View::Scroll(int mode, Point scroll, bool redraw)
  205. {
  206.     //if (focus)
  207.     //    focus->Scroll(mode, scroll, redraw);
  208.     //else
  209.     if (clippers) {
  210.     clippers->ForEach(VObject,Scroll)(mode, scroll, redraw);
  211.     }
  212. }
  213.  
  214. //---- event handling
  215.  
  216. EvtHandler *View::GetNextHandler()
  217. {
  218.     return nexthandler;
  219. }
  220.  
  221. void View::SetNextHandler(EvtHandler *eh)
  222. {
  223.     nexthandler= eh;
  224. }
  225.  
  226. Command *View::Input(Point lp, Token &t, Clipper *vf)
  227. {
  228.     focus= vf;
  229.     if (t.IsMouseButton() && !(t.Flags & eFlgButDown) && TestFlag(eVObjKbdFocus))
  230.     SetFirstHandler(this);
  231.     Command *cmd= VObject::Input(lp, t, vf);
  232.     //Command *cmd= DispatchEvents(lp, t, vf);
  233.     focus= 0;
  234.     return cmd;
  235. }
  236.  
  237. Command *View::DoCursorKeyCommand(EvtCursorDir d, Token t)
  238. {
  239.     if (focus)
  240.     focus->Scroll(cPartScrollStep, t.CursorPoint());
  241.     return VObject::DoCursorKeyCommand(d, t);
  242. }
  243.  
  244. Command *View::DoFunctionKeyCommand(int code, Token t)
  245. {
  246.     if (focus) {
  247.     switch (t.FunctionCode()) {
  248.     case 28:    // end
  249.         focus->Scroll(cPartScrollAbs, Point(0, 30000));
  250.         break;
  251.     case 22:    // home
  252.         focus->Scroll(cPartScrollAbs, gPoint0);
  253.         break;
  254.     case 24:    // page up
  255.         focus->Scroll(cPartScrollPage, Point(0, -1));
  256.         break;
  257.     case 30:    // page down
  258.         focus->Scroll(cPartScrollPage, Point(0, 1));
  259.         break;
  260.     }
  261.     }
  262.     return VObject::DoFunctionKeyCommand(code, t);
  263. }
  264.  
  265. //---- clipboard
  266.  
  267. bool View::CanPaste(Data*)
  268. {
  269.     return FALSE;
  270. }
  271.  
  272. Command *View::PasteData(Data*)
  273. {
  274.     return gNoChanges;
  275. }
  276.  
  277. bool View::HasSelection()
  278. {
  279.     return FALSE;
  280. }
  281.  
  282. static FileDialog *importDialog;
  283.  
  284. extern bool gPaste;
  285.  
  286. Command *View::DoMenuCommand(int cmd)
  287. {
  288.     Command *cm;
  289.     
  290.     switch (cmd) {
  291.     case cIMPORT:
  292.     if (importDialog == 0)
  293.         importDialog= new FileDialog;
  294.     
  295.     if (importDialog->ShowInWindow(eFDImport, GetWindow(), this) == cIdOk) {
  296.         Data *data= importDialog->GetData();
  297.         if (CanPaste(data)) {
  298.         gProgress->Start(form("Pasting file: %s", data->ShortName()), data->SizeHint());
  299.         gPaste= TRUE;
  300.         PasteData(data);
  301.         gPaste= FALSE;
  302.         cm= PasteData(data);
  303.         gProgress->Stop();
  304.         return cm;
  305.         }
  306.         ShowAlert(eAlertCaution, "Can't paste file (%s)", data->Type().AsString());
  307.     }
  308.     return gNoChanges;
  309.  
  310.     case cCOPY:
  311.     case cCUT:
  312.     return gNoChanges;
  313.  
  314.     case cPASTE:
  315.     cm= gClipBoard->PasteClipboard(this);
  316.     if (cm == gNoChanges)
  317.         ShowAlert(eAlertCaution, "Can't paste clipboard (%s)",
  318.                     gClipBoard->GetType()->Type().AsString());
  319.     return cm;
  320.  
  321.     case cPRINT:
  322.     Print();
  323.     return gNoChanges;
  324.  
  325.     default:
  326.     break;
  327.     }
  328.     return EvtHandler::DoMenuCommand(cmd);
  329. }
  330.  
  331. void View::DoSetupMenu(Menu *menu)
  332. {
  333.     EvtHandler::DoSetupMenu(menu);
  334.     if (menu->GetId() == cEDITMENU) {
  335.     VObject *paste= menu->FindItem(cPASTE);
  336.     if (paste && gClipBoard->CanPaste(this))
  337.         paste->Enable(TRUE, FALSE);
  338.     if (HasSelection())
  339.         menu->EnableItems(cCUT, cCOPY, 0);
  340.     menu->EnableItem(cIMPORT);
  341.     }
  342. }
  343.  
  344. void View::InspectorId(char *buf, int sz)
  345. {
  346.     Window *w= GetWindow();
  347.     if (w && w->GetNextHandler()) {
  348.     w->GetNextHandler()->InspectorId(buf, sz-6);
  349.     strn0cpy(buf, form("in %s", buf), sz);
  350.     } else
  351.     VObject::InspectorId(buf, sz);
  352. }
  353.  
  354.